<?php
if (! function_exists('_m') )
{
	if (!defined('MODULE_MULTIDOMAIN')) define('MODULE_MULTIDOMAIN',false);
	$GLOBALS['module']['ini'] = parse_ini_file(MODULE_PATH.'/config.ini',true);
	foreach ($GLOBALS['module']['ini']['define'] as $name => $value)
		if (!defined($name)) define($name,$value);



	function _m($path,$filter=false,$cntrl=MODULE_CONTROLLER,$ext=MODULE_EXT)
	{
//_log('__BEGIN ___________',$path,'fileter',$filter);
		// старые параметры
		$old_cwd = getcwd();
		$old_mod = isset($GLOBALS['module']) ? $GLOBALS['module'] : null ;

		//	проверяем протоколы
		$pp = parse_url($path);

		if (empty($pp['scheme']))
			$pp['scheme'] = 'file';

		$pp['scheme'] = strtolower($pp['scheme']);
		$_ = '';	//	result

		//все проверки
		if (in_array($pp['scheme'], array('http','https','ftp')))
		{
			$_ = _f($filter, file_get_contents($path));
		}
		elseif ('file'!=$pp['scheme'])
		{
			_error('Depricated scheme: '.$pp['scheme']);
			//return null; //	внезапно
		}

		//самый отжых
		if ('file'==$pp['scheme'])
		{
			_log('parse url', $pp);

			$p_tmp = !empty($pp['host']) ? $pp['host'] . $pp['path'] : $pp['path'];

			//	разборки вручную, ибо устанавливаем свои правила
			//	сворачивать здесь
			if (strrpos($p_tmp,'/')+1 == strlen($p_tmp) )		// заканчивается на / - признак каталога
			{
				//	самый простой вариант
				if (0===strpos($p_tmp,'/'))
				{
					$start_path = MODULE_PATH;
					$path = $p_tmp;
					$basename = $cntrl.$ext;
				}
				else
				{
					$start_path = $old_cwd;
					$path = $p_tmp;
					$basename = $cntrl.$ext;
				}
			}
			else	//	не заканчивается на слеш
			{
				$p_slash = strrpos($p_tmp,'/');
				$p_dot = strrpos($p_tmp,'.');
//_log('slash-dot',$p_slash,$p_dot);
				if ($p_slash == $p_dot-1 && strlen($p_tmp) == $p_dot+1 )
				{
					_error('slash-dot detected! are you idiot?',E_ERROR);
				}
				elseif ($p_slash > $p_dot || 0 === $p_slash)	//	т.е. заканчивается на хвост без точки
				//NB: порядок аргументов в логическом выражении!!!
				{
					// будем считать каталогом
					if (0===strpos($p_tmp,'/'))	// копипаста десу
					{
						$start_path = MODULE_PATH;
						$path = $p_tmp;
						$basename = $cntrl.$ext;
					}
					else
					{
						$start_path = $old_cwd;
						$path = $p_tmp;
						$basename = $cntrl.$ext;
					}
				}
				else	// всё-таки файл
				{
					if (0===strpos($p_tmp,'/'))	// копипаста десу
					{
						$start_path = MODULE_PATH;
						$path = substr($p_tmp,0,$p_slash);
						$basename = substr($p_tmp,$p_slash+1);
					}
					else
					{
						$start_path = $old_cwd;
						$path = substr($p_tmp,0,$p_slash);
						$basename = $p_slash>0 ? substr($p_tmp,$p_slash+1) : $p_tmp;
					}
				}
			}	// как же меня заклебало это расписывать

			//_log('basename',$start_path,$path,$basename);

			$path = '/'.trim($path,'/');	//	век живи - век ман читай
//_log($path);
			$param = array();
			$path_work = $path;	//	сохраним
			$start_path_work = $start_path;	//	сохраним

			if (MODULE_MULTIDOMAIN)
			{
				if ( defined('MODULE_DOMAINCUT') && strlen(MODULE_DOMAINCUT) )
				{
					$path_host = '@'.str_replace(MODULE_DOMAINCUT, '', HOST);
				}
				else
				{
					$path_host = '@'.HOST;
				}

				$start_path .= '/'.$path_host;

				//получаем путь и параметры
				while(!is_readable(realpath($start_path.$path.'/'.$basename)) && !empty($path))	//сразу на файл проверка
				{
					$param[] = substr($path,strrpos($path,'/')+1);
					$path = substr($path,0,strrpos($path,'/'));
				}
			}
			if (empty($path))	//	значит, не сложилось
			{
				$path = $path_work;	//	пробуем ещё раз
				$start_path = $start_path_work;
				$param = array();
				//_log ('oops!',$path,$start_path);
				while(!is_readable(realpath($start_path.$path.'/'.$basename)) && !empty($path))	// оставим проверку на пустой путь, ибо вдруг
				{
					$param[] = substr($path,strrpos($path,'/')+1);
					$path = substr($path,0,strrpos($path,'/'));
				}
			}
			//_log('end',$start_path,$path);

			//	закончили упражнение
			$GLOBALS['module'] = array_merge( $GLOBALS['module'],	array(
								'attr' => array_filter(array_reverse($param)),	//	сначала реверс, потом фильтр
								'path' => $path,
								) );

			chdir($start_path.$path);
_log ($start_path.$path.'/'.$basename);
			ob_start($filter);

			include $basename;

			$_ = ob_get_contents();

			ob_end_clean();
		}

		// восстанавливать параметры не будем. модуль должен сам позаботиться о сохранении

		return $_;
	}
}



if (! function_exists('_module') )
{
	function _module()
	{
		return call_user_func_array('_m',func_get_args());
	}
	function __()
	{
		return call_user_func_array('_m',func_get_args());
	}

}


if (! function_exists('_isPath') )
{
	function _isPath($str)
	{
		$str = trim($str);
		return empty($str) ? false : $str[0]=='/';
	}
}
if (! function_exists('_isXML') )
{
	function _isXML($str)
	{
		$str = trim($str);
		//var_dump('isXML',$str[0],'<'==$str[0]);
		return empty($str) ? false : '<'==$str[0];
	}
}
if (! function_exists('_isString') )
{
	function _isString($str)
	{
		return !(_isPath($str) && _isXML($str)) ;
	}
}

?>